package apibasej.db.transaction;

import java.util.ArrayList;
import java.util.LinkedHashMap;

import sun.reflect.generics.reflectiveObjects.NotImplementedException;

import apibasej.basic.misc.UtilStrObj;
import apibasej.db.to.ResultSelect;

public class CursorSelectRemote extends CursorSelect {

	private int cursor = -1; 
	private ResultSelect resultSelect;
	private GenericTransaction tr;
	
	// esta classe não tem sentido usar o cursor, pois sempre irá carregar tudo ...
	
	public CursorSelectRemote(GenericTransaction tr, ResultSelect resultSelect) {
		this.tr = tr;
		this.resultSelect = resultSelect;
	}

	private ResultSelect getResultSelect() throws Exception{
		return resultSelect;
	}
	
	@Override
	public Object getValResultSet(Class<?> typeReturn, boolean ignoreResultNullForPrimitives, int i) throws Exception {
		LinkedHashMap<Integer,Object> row = getResultSelect().getRows().get(cursor);
		Object v = row.get(i);
		// precisa fazer aqui, pois na execução no servidor a var ignoreResultNullForPrimitives não será setada. Ter opção de enviar este para na transação???
		
		if(v==null && ignoreResultNullForPrimitives){// precisa fazer aqui, pois na execução no servidor a var ignoreResultNullForPrimitives não será setada. Ter opção de enviar este para na transação???
			v = UtilStrObj.getDefaultForPrimitives(v, typeReturn);
		}
		return v;
	}

	@Override
	public Integer getTotalCountWithoutPagination() throws Exception {
		return getResultSelect().getTotalCountWithoutPagination();
	}
	
	
	@Override
	public void verifyCloseConnectionAfterExecute() {
		tr.verifyCloseAfterExecute();
	}
	@Override
	public void close() {
		tr.close();
	}
	
	@Override
	public boolean next() throws Exception {
		cursor++;
		return cursor<getResultSelect().getRows().size();
	}
	
	/*
	@Override
	public ArrayList<String> getNameCols() throws Exception {
		return getResultSelect().getNameCols();
	}*/
	
	@Override
	public int getCtCols() throws Exception {
		return getResultSelect().getCtCols();
	}
	
	@Override
	public int getNumRowsRead() {
		return cursor+1;
	}

	@Override
	public ArrayList<String> getNameColsStr() throws Exception {
		throw new NotImplementedException();
	}



}
